package algo3c3g3.model.action;

import algo3c3g3.model.material.*;
import algo3c3g3.model.*;
import org.jdom.Element;

import algo3c3g3.model.persistence.Persistence;

/**
 * Construye un puente de material solido y destructible hacia arriba
 * con inclinacion de 45 grados.
 */
public class Builder extends Action
{
    // Cantidad de bloques construidos.
    private int currentSize;
    
    private boolean finished;
    
    // Tamanio maximo en bloques del puente.
    private static final int MAX_BRIDGE_SIZE = 4;
    
    public void perform(Unit unit)
    {
        // Si termino de construir se vuelve Walker.
        if(finished)
        {
            unit.setAction(new Walker());
            return;
        }
        
        // Si el bloque siguiente es solido no puede seguir construyendo.
        // Debe ser un bloque no solido (aire).
        if((currentSize >= MAX_BRIDGE_SIZE) || (unit.nextBlockIsSolid()))
        {
            finished = true;
            return;
        }
        
        // Construye un bloque (reemplaza el siguiente por uno de material Bridge().
        unit.getOwnerMap().replaceBlock(unit.getNextSidePosition(), MaterialFactory.getInstance(Material.BRIDGE));
        
        // Si hay un techo solido o el proximo bloque en diagonal hacia arriba es solido
        // no puede seguir construyendo, ya que deberia moverse a ese bloque.
        if((unit.topBlockIsSolid()) || (unit.nextUpDiagBlockIsSolid()))
        {
            finished = true;
            return;
        }
        
        unit.moveUp();
        unit.walk();

        currentSize++;
    }
    
    @Override
    public Element save()
    {
        Element root = super.save();

        Element e = new Element("currentSize");
        e.addContent(Integer.toString(this.currentSize));
        root.addContent(e);

        e = new Element("finished");
        e.addContent(Boolean.toString(this.finished));
        root.addContent(e);

        return root;
    }

    @Override
    public void load(Element e)
    {
        this.currentSize =
            new Integer(e.getChildText("currentSize")).intValue();
        this.finished =
            new Boolean(e.getChildText("finished")).booleanValue();
    }

    
    
    public static void main(String[] args)
    {
        System.out.println();
        
        World world = new World(new Coord(1, 8), null, new TestMaps.TestBuilderMap());
        
        System.out.println("Mapa:");
        world.printMap();
        
        world.addUnit();
        
        Unit unit1 = world.getUnit(0);
        
        System.out.println("\nNueva unidad:");
        unit1.printStatus();
        
        System.out.println("\nCaminando:");
        
        Builder builder=new Builder();
        for(int i = 0; i < 20; i++)
        {
            world.moveUnits();
            unit1.printStatus();
            
            if(unit1.getXPosition() == 5)
            {
                System.out.println("\nAccion cambiada a Builder\n");
                
                builder=new Builder();
                unit1.setAction(builder);
            }
        }
        
        world.printMap();
        
        System.out.println();
        
        Persistence.toXMLFile(builder.save(),"C:\\salida.xml");
    }
}
